package xyz.lwm.lazycat.aop;

import java.lang.reflect.Method;

/**
 * aspect invocation
 *
 * @author lwm
 */
public interface Invocation {

    /**
     * 目标对象, 原对象, 非当前代理对象, 有可能也是代理对象, 如 jdk 代理
     *
     * @return target
     */
    Object getTarget();

    /**
     * 目标方法, 原始方法
     *
     * @return method
     */
    Method getMethod();

    /**
     * 执行参数, 原始参数
     *
     * @return args
     */
    Object[] getArgs();

    /**
     * 如果需要替换参数, 在此设置参数
     *
     * @param args args
     */
    void args(Object[] args);

    /**
     * 设置方法结果, 配合 {@link #invoke()} 使用, 用于拦截并更改方法结果; <br>
     *
     * @param result result
     */
    void result(Object result);

    /**
     * 获取方法结果
     *
     * @return result
     */
    Object getResult();

    /**
     * 执行方法并返回结果, 配合 {@link #result(Object)} 使用, 用于拦截并更改方法结果; <br>
     * 如拦截时, 调用者未执行此方法, Aop 会自动调用此方法.
     *
     * @throws Throwable throwable
     */
    void invoke() throws Throwable;

}
